iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
Software Development

Unity進階——做一個完整的遊戲系列 第 11

Day 11:讓攝影機跟隨玩家移動

  • 分享至 

  • xImage
  •  

前一天我完成了玩家移動控制,讓 Player 可以在 VillageScene 中用 WASD 或方向鍵移動。玩家能動之後,接下來很自然會遇到另一個問題:如果攝影機不跟著玩家移動,玩家很快就會走出畫面。

因此 Day 11 的目標,是讓 Main Camera 能夠跟隨玩家移動。這一天先不處理場景切換、鏡頭邊界或多場景出生點,只專注在一件事:讓攝影機能穩定追蹤玩家。

一開始我先檢查目前專案狀態。專案中還沒有安裝 Cinemachine,而目前需求也只是基本的 2D 鏡頭跟隨,所以這次先不額外安裝套件,而是自己寫一支簡單的 CameraFollow.cs 腳本。這樣可以讓功能保持單純,也比較容易理解攝影機是怎麼跟著玩家移動的。
完成腳本後,我將它掛到 Main Camera 上,並在 Inspector 中把 Player 指定為追蹤目標。

https://ithelp.ithome.com.tw/upload/images/20260909/20178373CM0DJHZN8b.png

在 Main Camera 的 Inspector 中,可以看到新增的 CameraFollow 元件。這個元件中有幾個重要設定:Target 是攝影機要追蹤的物件,這裡指定為 Player;Offset 用來控制攝影機和玩家之間的相對距離;Smooth Time 則控制鏡頭跟隨的平滑程度。

目前 Offset 設定為 X 0、Y 0、Z -10。這代表攝影機會跟著玩家的 X、Y 位置移動,但仍保持 Z 軸距離,避免攝影機直接貼到玩家身上。Smooth Time 則先設為 0.15,讓鏡頭不是瞬間跳到玩家位置,而是有一點平滑移動效果。

這次的 CameraFollow.cs 不需要截整支程式,只需要截核心邏輯就好。因為真正重要的部分集中在 LateUpdate() 裡。

https://ithelp.ithome.com.tw/upload/images/20260909/20178373kHP0e5B1Vx.png

CameraFollow 的核心放在 LateUpdate() 中,而不是一般的 Update()。這樣做的原因是,玩家移動通常會先在一幀中更新位置,攝影機再於 LateUpdate() 跟上玩家,畫面會比較穩定。如果攝影機和玩家同時在 Update() 中更新,就比較容易出現追蹤延遲或抖動感。

腳本中也加入了 target == null 的判斷。如果 Inspector 中沒有指定 Target,腳本會嘗試尋找場景中的 Player 物件,避免因為忘記拖曳目標而完全失效。

接著,攝影機會用 target.position + offset 計算目標位置。這樣攝影機就能追蹤玩家,同時保留原本的 Z 軸距離。最後透過 Vector3.SmoothDamp 平滑移動到目標位置,讓攝影機跟隨時不會太生硬。
設定完成後,我進入 Play 模式進行測試。測試方式很簡單:使用 WASD 或方向鍵移動玩家,觀察攝影機是否會跟著角色移動。

https://ithelp.ithome.com.tw/upload/images/20260909/20178373FDQ5n7ohKm.png

測試結果正常。玩家在村莊中移動時,Main Camera 會跟著玩家平滑移動,停下時鏡頭也會慢慢靠近玩家位置後停止。這讓 VillageScene 不再只是固定鏡頭畫面,而是可以隨著玩家探索地圖。

目前的攝影機跟隨還只是第一版,尚未加入鏡頭邊界限制。也就是說,如果玩家走到地圖邊緣,攝影機可能會看到場景外部。這個問題之後可以配合地圖邊界或場景碰撞一起處理。Day 11 先把「攝影機能跟隨玩家」這個核心功能完成即可。

完成測試後,我也儲存了 VillageScene 和專案,確認 CameraFollow 已經正確掛在 Main Camera 上。
透過 Day 11 的製作,玩家移動時畫面已經能跟著角色前進。這讓遊戲從「角色能在固定畫面中移動」進一步變成「玩家可以在村莊中探索」。接下來 Day 12 可以開始處理地圖碰撞與不可通行區域,例如房屋、柵欄、村莊邊界和主要障礙物,避免玩家穿過不該通過的地方。


上一篇
Day 10:讓玩家角色在村莊中移動
下一篇
Day 12:建立村莊不可通行區域
系列文
Unity進階——做一個完整的遊戲12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言